package com.example.casserver.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * JWT工具类
 * 提供JWT令牌的生成和验证功能
 * 用于CAS服务器的API认证
 */
@Component
public class JwtUtil {

    /**
     * JWT密钥
     * 从配置文件中读取，用于签名和验证JWT
     */
    @Value("${jwt.secret}")
    private String secret;

    /**
     * JWT过期时间（毫秒）
     * 从配置文件中读取
     */
    @Value("${jwt.expiration}")
    private long expiration;

    /**
     * 生成JWT令牌
     * 包含用户名信息，并设置签发时间和过期时间
     *
     * @param username 用户名
     * @return JWT令牌字符串
     */
    public String generateToken(String username) {
        return JWT.create()
                .withSubject(username)
                .withIssuedAt(new Date())
                .withExpiresAt(new Date(System.currentTimeMillis() + expiration))
                .sign(Algorithm.HMAC256(secret));
    }

    /**
     * 验证JWT令牌并提取用户名
     * 如果令牌无效或已过期，返回null
     *
     * @param token JWT令牌
     * @return 令牌中的用户名，如果令牌无效则返回null
     */
    public String validateTokenAndGetUsername(String token) {
        try {
            DecodedJWT jwt = JWT.require(Algorithm.HMAC256(secret))
                    .build()
                    .verify(token);
            return jwt.getSubject();
        } catch (JWTVerificationException e) {
            return null;
        }
    }
} 